//如果有一个数轴，数轴上有若干个点。要在数轴上找一点，使得它到各个点的距离之和最短。
//结论： 中位数就是最优解。中位数有这样的性质 ：所有数与中位数的绝对差之和最小。中位数是数列中间的那个数，或者是中间的那两个数之一。
sort(a+1,a+1+n);//排序
int sm=a[n/2+1];//中位数
for (i=1;i<=n;i++)
    ans=ans+abs(a[i]-sm);//统计和中位数之间的差
//同余下的处理
对于在 mod m的数的加和减，我们可以看成是在一个长度为m,从0到m−1的环形上做移动


数轴上有一些区间，在数轴上选取几个点，要求每个区间上最少有一个点。
题解
可以使用贪心解决。
将区间按右端点排序
遍历区间，如果该区间中不包含最后选的那个点，则选取区间右端点。如果包含最后选的那个点，则跳过。
输出所选点的个数。

题意解读
数轴上有一些区间，选取几个区间，要求所选的区间没有重合部分，求最多能选多个区间。
可以使用贪心解决。
将区间按右端点排序
遍历区间，如果该区间和上一个选的区间有重合，则跳过。如果和上一个选的区间没有重合，则选取该区间。
输出所选区间的个数。

数轴上有一些区间，要求将区间分成若干集合，每个集合中的区间两两不重叠。问：最少需要多少个这样的集合。
可以使用贪心算法来解决。
将区间按左端点排序。
依次遍历区间，如果当前区间能放到之前的某个集合中，则把该区间放到该集合，如果当前不能放到任意一个之前的集合中，则新开一个集合，把当前区间放到新开的集合中。
集合的数量就是答案。
关键步骤是第二步，如何判断当前区间能否放到之前的集合中。解决方法如下:
记录每个集合中保存的区间的最右侧端点，如果当前区间的左端点不和某个集合中保存的区间的最右侧端点相交，则当前区间不和该集合相交，能放到该集合中。
也就是，我们只需判断当前区间的左端点 是否和 右侧端点最小的那个集合是否相交即可。
为了快速找出右侧端点最小的那个集合，可以使用小根堆保存每个集合的右端点。

给定 N个区间 [ai,bi]以及一个区间 [s,t]，请你选择尽量少的区间，将指定区间完全覆盖。
将所有区间按照左端点从小到大进行排序
从前往后枚举每个区间，在所有能覆盖start的区间中，选择右端点的最大区间，然后将start更新成右端点的最大值